Skip to content

docs: add Kosli Capture Managed Service page - #380

Open
mintlify[bot] wants to merge 5 commits into
mainfrom
mintlify/2dca75a3
Open

mintlify[bot] wants to merge 5 commits into
mainfrom
mintlify/2dca75a3

Conversation

@mintlify

@mintlify mintlify Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Adds a new "Kosli Capture Managed Service" page to the Getting started section, based on a customer-facing overview drafted by Graham.

  • New page: getting_started/kosli_capture.md (sidebar label: "Kosli Capture")
  • Content adapted to docs style: second-person voice, sentence-case headings, setup steps in a Steps component
  • Added to the Getting started group in navigation, after Environments

Generated by Mintlify Agent.

Requested by: graham@kosli.com via Slack
Mintlify session: slack_1782915660.508229_D0AM66349C1

@mintlify
mintlify Bot requested a review from a team as a code owner September 2, 2026 12:07
@mintlify

mintlify Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated
kosli 🟢 Ready View Preview Sep 14, 2026, 4:50 PM

@claude

claude Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Claude finished @gsavage's task in 2m 44s —— View job


Doc review

7 findings, all posted inline: 5 Improvements, 2 Suggestions, 0 Critical.

The folder move in 6e1d5c5 is clean — both pages are in config/navigation.json under the new Kosli Capture group, the relative link flagged earlier is now root-relative, and every internal target resolves. No config/redirects.json entry is needed: neither getting_started/kosli_capture nor administration/kosli_capture.md was ever on main.

The findings cluster around one theme worth calling out above the line items: 7afa53c and b6dd574 removed scope statements without replacing them. The Current status section was the only place that said what Kosli Capture can snapshot, and the S3 statements were the only remaining hint after it went. What's left is overview.md:57 saying "all supported resources" — a phrase now undefined anywhere on the site — and an IAM policy on a second page that a reader has to reverse-engineer. Two sentences would close it.

The second theme is that the page split created duplication rather than resolving it: overview.md still carries both a ## Security section and an ## IAM permissions section covering ground that security.md now owns in more detail, and the two pages link to each other exactly once, in one direction.

Nothing in this PR touches a generated page, so there are no upstream findings.

Not blocking, but I'd fix the A's account with A's ExternalId leftover on overview.md:29 before merge — it's in the section customers will forward to their security teams.


  • Read changed files at branch HEAD
  • Check navigation + redirects for the folder move
  • Cross-file consistency checks
  • Post findings
    · branch mintlify/2dca75a3

Comment thread administration/kosli_capture.md Outdated
Comment thread administration/kosli_capture.md Outdated
Comment thread administration/kosli_capture.md Outdated
Comment thread administration/kosli_capture.md Outdated
Comment thread administration/kosli_capture.md Outdated
Comment thread administration/kosli_capture.md Outdated
Comment thread administration/kosli_capture.md Outdated
Comment thread administration/kosli_capture.md Outdated
Comment thread config/navigation.json Outdated
Comment thread administration/kosli_capture.md Outdated
@dangrondahl dangrondahl changed the title Add Kosli Capture Managed Service page docs: add Kosli Capture Managed Service page Sep 2, 2026
Comment thread administration/kosli_capture/overview.md
Comment thread administration/kosli_capture/overview.md
Comment thread administration/kosli_capture.md Outdated
Comment thread administration/managing_environments/overview.md Outdated
Comment thread getting_started/environments.md Outdated
Comment thread administration/kosli_capture.md Outdated
Comment thread administration/kosli_capture.md Outdated
Comment thread administration/kosli_capture.md Outdated
Comment thread administration/kosli_capture.md Outdated
Comment thread administration/kosli_capture.md Outdated
Comment thread administration/kosli_capture.md Outdated
Comment thread getting_started/environments.md Outdated
- lambda:GetFunction
- lambda:GetLayerVersion
Resource: "*"
````

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion — closing fence has four backticks, and neither code block declares a language.

The four-backtick close does still terminate the block under CommonMark, so it renders — but it's a stray character, and neither block (line 20 and line 46) tags a language, so both lose syntax highlighting on what is otherwise a page of YAML.

Change ``````yaml on lines 20 and 46, and:

Suggested change
````

dangrondahl added a commit that referenced this pull request Sep 10, 2026
Phase 1 of #393. Closes #395. One edit to config/navigation.json: no page
files move, no URLs change, no redirects needed, revertible in this commit.

A URL comes from the file path, not from sidebar position, so every one of
the 207 pages keeps its address while changing tab.

Replace the five tabs, which mixed four organizing principles, with seven
named after subjects. Each carries a one-sentence membership test:

- Discover Kosli (27) - the reader has not started yet: orientation, first
  run, learning, getting unstuck
- Platform administration (21) - the reader is configuring Kosli itself for
  an organization
- Risks & controls (10) - the reader is deciding what must be true, or
  proving it was
- Environments and runtime (4) - the reader is reporting, or interpreting,
  what is actually running
- Record evidence (15) - the reader is instrumenting a pipeline to produce
  evidence
- Reference (129) - the reader knows what they want and needs exact syntax
  or values
- Changelog (1) - what shipped

Documentation held 61 pages across 8 groups spanning all four Diataxis types,
with no rule for what belonged in it. Splitting Documentation from Reference
by page form forced authors to classify a page before they could place it;
naming tabs after subjects means one subject's four Diataxis needs sit in
one tab, sorted by form inside it.

Tab labels are sentence case per CLAUDE.md, so `Risks & controls` and
`Environments and runtime` rather than the Title Case forms in #395. This
resolves open decision 5 in the proposal and keeps Phase 0's casing work
from being undone two tabs later. Every tab now carries an icon, clearing
the last inconsistent-icons finding.

Reference is unchanged beyond gaining an icon. H1: update-cli-nav.py:154-158
hard-codes `tab == "Reference"` and `item == "CLI Reference"` and exits 1
without them, so neither label can move.

Three deviations from the proposal's group layout, all because the group it
specifies would hold a single page and reintroduce what Phase 0 just
removed:

- Policies and Advanced evaluation are merged into `Policies and
  evaluation`. The proposal's policy-reference/* entries are cross-links,
  which stay in Reference.
- Working with controls joins `Risks and controls` rather than heading a
  group of one.
- Environments and runtime carries managing_environments/overview as a
  direct page beside `Reporting your runtime`.

The proposal's `Infrastructure as code` group is omitted: its Terraform and
Helm entry points are cross-links into Reference, so it would hold no pages
of its own. The `Kosli Capture` and `How reporting works` groups are also
omitted because all four of their pages are still in unmerged PRs (#380,
#337, #391); those PRs now have an obvious home to land in, which was the
argument for the tab.

Verified: 207 pages before and after, set-identical with no duplicates;
audit_navigation.py down to 1 advisory finding; pytest 44 passed;
mint broken-links clean.
dangrondahl added a commit that referenced this pull request Sep 10, 2026
Phase 1 of #393. Closes #395. One edit to config/navigation.json: no page
files move, no URLs change, no redirects needed, revertible in this commit.

A URL comes from the file path, not from sidebar position, so every one of
the 207 pages keeps its address while changing tab.

Replace the five tabs, which mixed four organizing principles, with seven
named after subjects. Each carries a one-sentence membership test:

- Discover Kosli (27) - the reader has not started yet: orientation, first
  run, learning, getting unstuck
- Platform administration (21) - the reader is configuring Kosli itself for
  an organization
- Risks & controls (10) - the reader is deciding what must be true, or
  proving it was
- Environments and runtime (4) - the reader is reporting, or interpreting,
  what is actually running
- Record evidence (15) - the reader is instrumenting a pipeline to produce
  evidence
- Reference (129) - the reader knows what they want and needs exact syntax
  or values
- Changelog (1) - what shipped

Documentation held 61 pages across 8 groups spanning all four Diataxis types,
with no rule for what belonged in it. Splitting Documentation from Reference
by page form forced authors to classify a page before they could place it;
naming tabs after subjects means one subject's four Diataxis needs sit in
one tab, sorted by form inside it.

Tab labels are sentence case per CLAUDE.md, so `Risks & controls` and
`Environments and runtime` rather than the Title Case forms in #395. This
resolves open decision 5 in the proposal and keeps Phase 0's casing work
from being undone two tabs later. Every tab now carries an icon, clearing
the last inconsistent-icons finding.

Reference is unchanged beyond gaining an icon. H1: update-cli-nav.py:154-158
hard-codes `tab == "Reference"` and `item == "CLI Reference"` and exits 1
without them, so neither label can move.

Three deviations from the proposal's group layout, all because the group it
specifies would hold a single page and reintroduce what Phase 0 just
removed:

- Policies and Advanced evaluation are merged into `Policies and
  evaluation`. The proposal's policy-reference/* entries are cross-links,
  which stay in Reference.
- Working with controls joins `Risks and controls` rather than heading a
  group of one.
- Environments and runtime carries managing_environments/overview as a
  direct page beside `Reporting your runtime`.

The proposal's `Infrastructure as code` group is omitted: its Terraform and
Helm entry points are cross-links into Reference, so it would hold no pages
of its own. The `Kosli Capture` and `How reporting works` groups are also
omitted because all four of their pages are still in unmerged PRs (#380,
argument for the tab.

Verified: 207 pages before and after, set-identical with no duplicates;
audit_navigation.py down to 1 advisory finding; pytest 44 passed;
mint broken-links clean.
dangrondahl added a commit that referenced this pull request Sep 10, 2026
Phase 1 of #393. Closes #395. One edit to config/navigation.json: no page
files move, no URLs change, no redirects needed, revertible in this commit.

A URL comes from the file path, not from sidebar position, so every one of
the 207 pages keeps its address while changing tab.

Replace the five tabs, which mixed four organizing principles, with seven
named after subjects. Each carries a one-sentence membership test:

- Discover Kosli (27) - the reader has not started yet: orientation, first
  run, learning, getting unstuck
- Platform administration (21) - the reader is configuring Kosli itself for
  an organization
- Risks & controls (10) - the reader is deciding what must be true, or
  proving it was
- Environments and runtime (4) - the reader is reporting, or interpreting,
  what is actually running
- Record evidence (15) - the reader is instrumenting a pipeline to produce
  evidence
- Reference (129) - the reader knows what they want and needs exact syntax
  or values
- Changelog (1) - what shipped

Documentation held 61 pages across 8 groups spanning all four Diataxis types,
with no rule for what belonged in it. Splitting Documentation from Reference
by page form forced authors to classify a page before they could place it;
naming tabs after subjects means one subject's four Diataxis needs sit in
one tab, sorted by form inside it.

Tab labels are sentence case per CLAUDE.md, so `Risks & controls` and
`Environments and runtime` rather than the Title Case forms in #395. This
resolves open decision 5 in the proposal and keeps Phase 0's casing work
from being undone two tabs later. Every tab now carries an icon, clearing
the last inconsistent-icons finding.

Reference is unchanged beyond gaining an icon. H1: update-cli-nav.py:154-158
hard-codes `tab == "Reference"` and `item == "CLI Reference"` and exits 1
without them, so neither label can move.

Three deviations from the proposal's group layout, all because the group it
specifies would hold a single page and reintroduce what Phase 0 just
removed:

- Policies and Advanced evaluation are merged into `Policies and
  evaluation`. The proposal's policy-reference/* entries are cross-links,
  which stay in Reference.
- Working with controls joins `Risks and controls` rather than heading a
  group of one.
- Environments and runtime carries managing_environments/overview as a
  direct page beside `Reporting your runtime`.

The proposal's `Infrastructure as code` group is omitted: its Terraform and
Helm entry points are cross-links into Reference, so it would hold no pages
of its own. The `Kosli Capture` and `How reporting works` groups are also
omitted because all four of their pages are still in unmerged PRs (#380,
argument for the tab.

Verified: 207 pages before and after, set-identical with no duplicates;
audit_navigation.py down to 1 advisory finding; pytest 44 passed;
mint broken-links clean.
mintlify Bot and others added 4 commits September 14, 2026 16:25
We've recently decided on a slightly different approach to the runtime
security of the Kosli Capture service, and this commit updates the
overall documentation to be aligned to the changes we've decided
Kosli Capture does not need S3 access _at the moment_ and so removing it
here helps to provide a simpler security-posture.
Comment thread administration/kosli_capture.md Outdated

## IAM permissions

For Kosli Capture to snapshot your environment, you must grant a set of read-only permissions. Kosli's CloudFormation template lists these. The permissions are typically "Describe" or "List" permissions. The [Kosli Capture Security](./kosli_capture_security) page provides a deep-diver into the structure of the permissions needed.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Critical — relative link. ./kosli_capture_security is the only relative internal link in the repo (grep -rn "](\./" returns just this line). CLAUDE.md core rule 3 requires root-relative paths — relative links break when a page moves, and mint broken-links will flag it.

Two other things on the line: "deep-diver" should be "deep dive", and there's a double space after "permissions."

Suggested change
For Kosli Capture to snapshot your environment, you must grant a set of read-only permissions. Kosli's CloudFormation template lists these. The permissions are typically "Describe" or "List" permissions. The [Kosli Capture Security](./kosli_capture_security) page provides a deep-diver into the structure of the permissions needed.
For Kosli Capture to snapshot your environment, you must grant a set of read-only permissions. Kosli's CloudFormation template lists these. The permissions are typically "Describe" or "List" permissions. The [Kosli Capture security](/administration/kosli_capture_security) page provides a deep dive into the structure of the permissions needed.

Comment on lines +27 to +33
The security of your cloud infrastructure is the primary driver behind the internal architecture of the Kosli Capture managed service. Kosli Capture runs as a shared, autoscaled service, but each job runs under a role that is scoped to one customer

* A Kosli Capture worker picks up a job for your organization and assumes a Kosli-side role that exists only for your organization. Only that role is permitted to call AssumeRole into A's account with A's ExternalId.
* When the job finishes, those credentials are discarded. A worker holding credentials for your cloud account has no path to anyone else's account.
* The trust policy's ExternalId lives in Parameter Store and is readable only by the Kosli-side role for your organization. The shared task role cannot read any customer's ExternalId. Separation is enforced by IAM, not by application code.

Kosli Catpure does not hold any customer data, it is near-stateless with the only thing it keeps is your configuration data. Snapshots taken by Kosli Catpure are immediately sent to Kosli through the same ingest path as your existing pipelines.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Critical — this section still refers to an unnamed "customer A". Line 29 reads "Only that role is permitted to call AssumeRole into A's account with A's ExternalId." Nothing on the page defines "A" — it's carried over from an internal design document where customers were labelled A and B. A reader hits an unresolvable pronoun in the one section they are most likely to forward to their security team.

Three more defects in the same block:

  • Line 27 has no closing full stop ("...scoped to one customer").
  • "Kosli Catpure" appears twice on line 33 — the product name is misspelled. Vale won't catch this: .vale.ini sets BasedOnStyles = Kosli, and styles/Kosli/ contains only AmericanSpelling.yml, so there is no general spellchecker on this repo.
  • Line 33 is a comma splice ("...customer data, it is near-stateless...").
Suggested change
The security of your cloud infrastructure is the primary driver behind the internal architecture of the Kosli Capture managed service. Kosli Capture runs as a shared, autoscaled service, but each job runs under a role that is scoped to one customer
* A Kosli Capture worker picks up a job for your organization and assumes a Kosli-side role that exists only for your organization. Only that role is permitted to call AssumeRole into A's account with A's ExternalId.
* When the job finishes, those credentials are discarded. A worker holding credentials for your cloud account has no path to anyone else's account.
* The trust policy's ExternalId lives in Parameter Store and is readable only by the Kosli-side role for your organization. The shared task role cannot read any customer's ExternalId. Separation is enforced by IAM, not by application code.
Kosli Catpure does not hold any customer data, it is near-stateless with the only thing it keeps is your configuration data. Snapshots taken by Kosli Catpure are immediately sent to Kosli through the same ingest path as your existing pipelines.
The security of your cloud infrastructure is the primary driver behind the internal architecture of the Kosli Capture managed service. Kosli Capture runs as a shared, autoscaled service, but each job runs under a role that is scoped to a single customer.
* A Kosli Capture worker picks up a job for your organization and assumes a Kosli-side role that exists only for your organization. Only that role is permitted to call `AssumeRole` into your account with your external ID.
* When the job finishes, those credentials are discarded. A worker holding credentials for your cloud account has no path to any other account.
* The trust policy's external ID lives in Parameter Store and is readable only by the Kosli-side role for your organization. The shared task role cannot read any customer's external ID. Separation is enforced by IAM, not by application code.
Kosli Capture holds no customer data. It is near-stateless, keeping only your configuration. Snapshots taken by Kosli Capture are immediately sent to Kosli through the same ingest path as your existing pipelines.

(The suggestion also unifies on "external ID", which is the form used on lines 71–73 and on the security page.)


## Kosli capture permissions

The Kosli Capture managed service uses the public AWS, GCP and Azure APIs to extract information about your cloud environments. In order to do this, you need to provide Kosli with an IAM role that allows access to these APIs. The role is created and owned by you. Kosli publishes a CloudFormation template, for use in AWS, showing the permissions needed. The template is publicly accessible and can be used directly within an `aws cloudformation create-stack` call.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improvement — GCP and Azure are claimed only here, and the "publicly accessible" template still has no URL.

Two problems in one sentence:

  1. GCP/Azure. This says Kosli Capture "uses the public AWS, GCP and Azure APIs", but everything else across both pages is AWS-only: IAM role, CloudFormation, ECS and Lambda policy statements, and kosli_capture.md:57/:63 talk only about AWS accounts. A reader on GCP or Azure is told the service uses their provider's API and then given no mechanism to grant access. The Current status section that used to scope this ("Support for … other cloud providers is in active development") was dropped in 7afa53c, so this is now the only provider-scope statement on either page — and it over-claims.
  2. The template URL. "The template is publicly accessible and can be used directly within an aws cloudformation create-stack call" is the most actionable sentence on the page, but the template is named five times across the two pages and never linked. A reader who wants to review the permissions before contacting Customer Success has nowhere to go. If the URL is public, link it and show the create-stack invocation; if it isn't public yet, say "Kosli provides the template during onboarding" so the reader stops looking.
Suggested change
The Kosli Capture managed service uses the public AWS, GCP and Azure APIs to extract information about your cloud environments. In order to do this, you need to provide Kosli with an IAM role that allows access to these APIs. The role is created and owned by you. Kosli publishes a CloudFormation template, for use in AWS, showing the permissions needed. The template is publicly accessible and can be used directly within an `aws cloudformation create-stack` call.
The Kosli Capture managed service uses the public AWS APIs to extract information about your cloud environments. To do this, you provide Kosli with an IAM role that allows access to these APIs. The role is created and owned by you. Kosli publishes a CloudFormation template showing the permissions needed, which you can use directly in an `aws cloudformation create-stack` call.

- lambda:GetFunction
- lambda:GetLayerVersion
Resource: "*"
````

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improvement — stray fourth backtick, and the S3 removal left the block's framing stale.

The closing fence is ```` (four backticks). CommonMark still terminates the block, so it renders — but it's a stray character in the last line of the page.

More substantively: b6dd574 removed the S3BucketMetadataOnly allow and the NeverReadObjectData deny, and with them the comment that explained why the explicit denies exist ("redundant given the allow-list above, but they are here so that a reviewer can verify the boundary…"). The surviving NeverDownloadFunctionCode deny at line 94 is now an unexplained deny in a policy of allows — its own comment explains what it blocks but not why a deny is used rather than simply omitting the action. For a page whose whole purpose is passing a security review, that rationale was worth keeping.

Neither code block declares a language, so both lose highlighting on what is otherwise a page of YAML — change ``` to ```yaml on lines 20 and 46.

Suggested change
````

Comment on lines +57 to +61
Kosli Capture finds all supported resources within your AWS accounts, and examines the tags on those resources to determine which Kosli environment should hold the snapshots. Kosli Capture will create physical environments for you.

Kosli Capture can filter out resources based on your tags.

As your cloud environment evolves, such as the addition of new ECS clusters or the retirement of existing Lambdas, Kosli Capture automatically detects the changes. Because Kosli Capture creates physical environments as needed, when your infrastructure changes, Kosli will keep up. No changes to the configuration created during the initial setup are required.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improvement — "all supported resources" is now undefined anywhere on the site, and auto-creation is claimed twice.

The Current status section was removed in 7afa53c, which took with it the only statement of what Kosli Capture can snapshot. As of this HEAD:

  • line 57 says "all supported resources" without defining the set;
  • line 61 uses ECS clusters and Lambdas as incidental examples;
  • the only actual signal is the IAM policy on the security page (ECS + Lambda — S3 was dropped in b6dd574).

So a reader evaluating Kosli Capture has to reverse-engineer the supported resource types from an IAM policy two pages away. One sentence naming them ("Kosli Capture currently snapshots ECS services and Lambda functions") restores what the removed section provided, and keeps this page in sync when S3 or EKS lands.

Separately, environment auto-creation is stated on line 57 ("Kosli Capture will create physical environments for you") and again on line 61 ("Because Kosli Capture creates physical environments as needed, when your infrastructure changes, Kosli will keep up") — the second is circular, restating the claim as its own reason. Folding it into the evolution paragraph lands it once, where it matters.

Suggested change
Kosli Capture finds all supported resources within your AWS accounts, and examines the tags on those resources to determine which Kosli environment should hold the snapshots. Kosli Capture will create physical environments for you.
Kosli Capture can filter out resources based on your tags.
As your cloud environment evolves, such as the addition of new ECS clusters or the retirement of existing Lambdas, Kosli Capture automatically detects the changes. Because Kosli Capture creates physical environments as needed, when your infrastructure changes, Kosli will keep up. No changes to the configuration created during the initial setup are required.
Kosli Capture currently snapshots ECS services and Lambda functions. It finds these resources within your AWS accounts and examines their tags to determine which Kosli environment should hold the snapshots.
Kosli Capture can filter out resources based on your tags.
As your cloud environment evolves, such as the addition of new ECS clusters or the retirement of existing Lambdas, Kosli Capture automatically detects the changes and creates any new physical environments needed. No changes to the configuration created during the initial setup are required.


## Hands-off operation

Kosli Capture has been designed to operate with no on-going support from you. Once the initial security permissions have been created, Kosli capture will continue to operate in a headless mode. Monitoring, maintenance and rotation of API keys is all handed automatically. As your cloud infrastructure changes over time, Kosli capture will continue to find resources according to your tagging scheme without you needing to do anything; your application teams do not need to take any action in order to onboard their products and services into Kosli.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improvement — this over-claims against the tag-driven model the page is built on, plus two word-level defects.

"your application teams do not need to take any action in order to onboard their products and services into Kosli" contradicts lines 18, 23 and 57, which all say routing is driven by your tagging scheme. An untagged new service can't be routed into an environment — so the action app teams do need to take is tagging their resources to the scheme. Saying that is more useful than claiming zero action, and it's exactly what a platform team needs to pass on.

Also on this line: "rotation of API keys is all handed automatically" → "handled", and "Kosli capture" is lowercase twice (capitalized everywhere else on the page). Neither is caught by vale-spellcheckstyles/Kosli/ only holds AmericanSpelling.yml.

Suggested change
Kosli Capture has been designed to operate with no on-going support from you. Once the initial security permissions have been created, Kosli capture will continue to operate in a headless mode. Monitoring, maintenance and rotation of API keys is all handed automatically. As your cloud infrastructure changes over time, Kosli capture will continue to find resources according to your tagging scheme without you needing to do anything; your application teams do not need to take any action in order to onboard their products and services into Kosli.
Kosli Capture has been designed to operate with no on-going support from you. Once the initial security permissions have been created, Kosli Capture will continue to operate in a headless mode. Monitoring, maintenance and rotation of API keys is all handled automatically. As your cloud infrastructure changes over time, Kosli Capture will continue to find resources according to your tagging scheme; as long as application teams tag their resources to that scheme, their products and services are onboarded into Kosli with no further action.


Kosli Capture connects to your cloud accounts using permissions that you manage. You configure Kosli Capture by providing a few details describing what you want to be in scope, and Kosli Capture uses the permissions to regularly reach into your estate and record snapshots, sending the data into your Kosli organization. Kosli Capture is architected to be driven by your tagging scheme; it examines the tags on your infrastructure and uses them to determine how to structure the snapshots, and how to build the environments within Kosli.

There are several benefits to this this architecture:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion — duplicated word, and the bullets use semicolon terminators.

"to this this architecture" has a doubled "this". Also, the two bullets end in ; and . and begin lowercase — every other bulleted list in this file and in kosli_capture_security.md uses sentence-cased bullets (see lines 29–31).

Suggested change
There are several benefits to this this architecture:
There are several benefits to this architecture:
* The only infrastructure you need to manage is an IAM role — you do not need to install or run any additional software in your cloud estate.
* Kosli Capture leverages your existing tagging scheme, so as your infrastructure evolves, Kosli Capture automatically discovers the snapshots it needs to take.

Comment on lines +25 to +27
## Security

The security of your cloud infrastructure is the primary driver behind the internal architecture of the Kosli Capture managed service. Kosli Capture runs as a shared, autoscaled service, but each job runs under a role that is scoped to one customer

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion — this section duplicates the dedicated security page without linking to it.

administration/kosli_capture_security.md is the sibling page in the new nav group, and its whole subject is this. The only link between the two pages is buried at line 69 under "IAM permissions" (and is relative — see the other comment). A reader who stops at this section never learns the deeper page exists.

A single forward pointer at the end of this section, e.g. "For the IAM role, trust policy and full permission list, see Kosli Capture security." — the security page has no link back to the overview either, so the pair is currently only navigable via the sidebar.

More Kosli Capture content is coming, so the two existing pages now
live under administration/kosli_capture/ rather than as loose files in
administration/. The files are renamed to overview.md and security.md to
match the sibling groups such as managing_environments/overview.

The navigation group and the inbound links from the environments pages
are updated to the new paths. The overview page's link to the security
page was a relative link, which the repo conventions forbid, so it is
now root-relative.

No redirects are added because these pages have not yet been published
from main.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Comment on lines +27 to +33
The security of your cloud infrastructure is the primary driver behind the internal architecture of the Kosli Capture managed service. Kosli Capture runs as a shared, autoscaled service, but each job runs under a role that is scoped to one customer

* A Kosli Capture worker picks up a job for your organization and assumes a Kosli-side role that exists only for your organization. Only that role is permitted to call AssumeRole into A's account with A's ExternalId.
* When the job finishes, those credentials are discarded. A worker holding credentials for your cloud account has no path to anyone else's account.
* The trust policy's ExternalId lives in Parameter Store and is readable only by the Kosli-side role for your organization. The shared task role cannot read any customer's ExternalId. Separation is enforced by IAM, not by application code.

Kosli Catpure does not hold any customer data, it is near-stateless with the only thing it keeps is your configuration data. Snapshots taken by Kosli Catpure are immediately sent to Kosli through the same ingest path as your existing pipelines.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improvement — this section still refers to an unnamed "customer A". Line 29 reads "Only that role is permitted to call AssumeRole into A's account with A's ExternalId." Nothing on the page defines "A" — it reads as a leftover from an internal design document where customers were labelled A and B. This is the one section a reader is most likely to forward to their own security team, and it contains an unresolvable pronoun.

Two more defects in the same block: line 27 has no closing full stop ("...scoped to one customer"), and line 33 is a comma splice ("...customer data, it is near-stateless...") whose second clause also doesn't parse ("with the only thing it keeps is your configuration data").

Suggested change
The security of your cloud infrastructure is the primary driver behind the internal architecture of the Kosli Capture managed service. Kosli Capture runs as a shared, autoscaled service, but each job runs under a role that is scoped to one customer
* A Kosli Capture worker picks up a job for your organization and assumes a Kosli-side role that exists only for your organization. Only that role is permitted to call AssumeRole into A's account with A's ExternalId.
* When the job finishes, those credentials are discarded. A worker holding credentials for your cloud account has no path to anyone else's account.
* The trust policy's ExternalId lives in Parameter Store and is readable only by the Kosli-side role for your organization. The shared task role cannot read any customer's ExternalId. Separation is enforced by IAM, not by application code.
Kosli Catpure does not hold any customer data, it is near-stateless with the only thing it keeps is your configuration data. Snapshots taken by Kosli Catpure are immediately sent to Kosli through the same ingest path as your existing pipelines.
The security of your cloud infrastructure is the primary driver behind the internal architecture of the Kosli Capture managed service. Kosli Capture runs as a shared, autoscaled service, but each job runs under a role that is scoped to a single customer.
* A Kosli Capture worker picks up a job for your organization and assumes a Kosli-side role that exists only for your organization. Only that role is permitted to call `AssumeRole` into your account with your external ID.
* When the job finishes, those credentials are discarded. A worker holding credentials for your cloud account has no path to any other account.
* The trust policy's external ID lives in Parameter Store and is readable only by the Kosli-side role for your organization. The shared task role cannot read any customer's external ID. Separation is enforced by IAM, not by application code.
Kosli Capture holds no customer data. It is near-stateless, keeping only your configuration. Snapshots taken by Kosli Capture are immediately sent to Kosli through the same ingest path as your existing pipelines.

(The suggestion also unifies on "external ID", the form used on lines 71–73 and on the security page.)


## Kosli capture permissions

The Kosli Capture managed service uses the public AWS, GCP and Azure APIs to extract information about your cloud environments. In order to do this, you need to provide Kosli with an IAM role that allows access to these APIs. The role is created and owned by you. Kosli publishes a CloudFormation template, for use in AWS, showing the permissions needed. The template is publicly accessible and can be used directly within an `aws cloudformation create-stack` call.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improvement — GCP and Azure are claimed only here, and the "publicly accessible" template still has no URL.

Two problems in one sentence:

  1. GCP/Azure. This says Kosli Capture "uses the public AWS, GCP and Azure APIs", but every mechanism described across both pages is AWS-only: an IAM role, a CloudFormation template, and ECS/Lambda policy statements. kosli_capture/overview.md:57 and :65 talk only about AWS accounts and regions. The Current status section that used to scope this ("Support for … other cloud providers is in active development") was dropped in 7afa53c, so this line is now the only provider-scope statement on either page — and it over-claims. A reader on GCP or Azure is told their provider's API is used and then given no way to grant access.
  2. The template URL. "The template is publicly accessible and can be used directly within an aws cloudformation create-stack call" is the most actionable sentence on the page, but the template is named five times across the two pages and never once linked. A reader who wants to review the permissions before contacting Customer Success has nowhere to go. If the URL is public, link it and show the create-stack invocation. If it is not public yet, say "Kosli provides the template during onboarding" so the reader stops looking.
Suggested change
The Kosli Capture managed service uses the public AWS, GCP and Azure APIs to extract information about your cloud environments. In order to do this, you need to provide Kosli with an IAM role that allows access to these APIs. The role is created and owned by you. Kosli publishes a CloudFormation template, for use in AWS, showing the permissions needed. The template is publicly accessible and can be used directly within an `aws cloudformation create-stack` call.
The Kosli Capture managed service uses the public AWS APIs to extract information about your cloud environments. To do this, you provide Kosli with an IAM role that allows access to these APIs. The role is created and owned by you. Kosli publishes a CloudFormation template showing the permissions needed, which you can use directly in an `aws cloudformation create-stack` call.

Comment on lines +57 to +61
Kosli Capture finds all supported resources within your AWS accounts, and examines the tags on those resources to determine which Kosli environment should hold the snapshots. Kosli Capture will create physical environments for you.

Kosli Capture can filter out resources based on your tags.

As your cloud environment evolves, such as the addition of new ECS clusters or the retirement of existing Lambdas, Kosli Capture automatically detects the changes. Because Kosli Capture creates physical environments as needed, when your infrastructure changes, Kosli will keep up. No changes to the configuration created during the initial setup are required.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improvement — "all supported resources" is no longer defined anywhere on the site.

7afa53c removed the Current status section, which was the only statement of what Kosli Capture can snapshot, and b6dd574 then dropped the S3 statements from the policy on the security page. At this HEAD:

  • line 57 says "all supported resources" without defining the set;
  • line 61 uses ECS clusters and Lambdas only as incidental examples;
  • the only real signal is the IAM policy on security.md (ECS + Lambda).

So a reader evaluating Kosli Capture has to reverse-engineer the supported resource types from an IAM policy on another page. One sentence naming them restores what the removed section provided, and gives you an obvious place to update when S3 or EKS lands.

Separately, environment auto-creation is claimed twice — line 57 ("Kosli Capture will create physical environments for you") and again on line 61 ("Because Kosli Capture creates physical environments as needed, when your infrastructure changes, Kosli will keep up"), where it is restated as its own reason. Folding it into the evolution paragraph lands it once, in the place where it matters.

Suggested change
Kosli Capture finds all supported resources within your AWS accounts, and examines the tags on those resources to determine which Kosli environment should hold the snapshots. Kosli Capture will create physical environments for you.
Kosli Capture can filter out resources based on your tags.
As your cloud environment evolves, such as the addition of new ECS clusters or the retirement of existing Lambdas, Kosli Capture automatically detects the changes. Because Kosli Capture creates physical environments as needed, when your infrastructure changes, Kosli will keep up. No changes to the configuration created during the initial setup are required.
Kosli Capture currently snapshots ECS services and Lambda functions. It finds these resources within your AWS accounts and examines their tags to determine which Kosli environment should hold the snapshots.
Kosli Capture can filter out resources based on your tags.
As your cloud environment evolves, such as the addition of new ECS clusters or the retirement of existing Lambdas, Kosli Capture automatically detects the changes and creates any new physical environments needed. No changes to the configuration created during the initial setup are required.


## Hands-off operation

Kosli Capture has been designed to operate with no on-going support from you. Once the initial security permissions have been created, Kosli capture will continue to operate in a headless mode. Monitoring, maintenance and rotation of API keys is all handed automatically. As your cloud infrastructure changes over time, Kosli capture will continue to find resources according to your tagging scheme without you needing to do anything; your application teams do not need to take any action in order to onboard their products and services into Kosli.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improvement — the closing clause over-claims against the tag-driven model this page is built on.

"your application teams do not need to take any action in order to onboard their products and services into Kosli" contradicts lines 18, 23 and 57, which all say routing is driven by your tagging scheme. An untagged new service cannot be routed into an environment, so the action app teams do need to take is tagging their resources to the scheme. Stating that is more useful than claiming zero action — it is exactly the instruction a platform team needs to pass on, and it is the one thing that will generate support tickets if left unsaid.

Suggested change
Kosli Capture has been designed to operate with no on-going support from you. Once the initial security permissions have been created, Kosli capture will continue to operate in a headless mode. Monitoring, maintenance and rotation of API keys is all handed automatically. As your cloud infrastructure changes over time, Kosli capture will continue to find resources according to your tagging scheme without you needing to do anything; your application teams do not need to take any action in order to onboard their products and services into Kosli.
Kosli Capture has been designed to operate with no on-going support from you. Once the initial security permissions have been created, Kosli Capture will continue to operate in a headless mode. Monitoring, maintenance and rotation of API keys is all handled automatically. As your cloud infrastructure changes over time, Kosli Capture will continue to find resources according to your tagging scheme; as long as application teams tag their resources to that scheme, their products and services are onboarded into Kosli with no further action.

Comment on lines +67 to +73
## IAM permissions

For Kosli Capture to snapshot your environment, you must grant a set of read-only permissions. Kosli's CloudFormation template lists these. The permissions are typically "Describe" or "List" permissions. The [Kosli Capture Security](/administration/kosli_capture/security) page provides a deep-diver into the structure of the permissions needed.

The IAM role created in your environment includes a trust policy that allows Kosli Capture to assume the role. The trust policy limits access to the AWS account in which Kosli Capture is running. Furthermore, the trust policy includes an external ID that acts as a shared secret between Kosli and you, so that only access from Kosli Capture is permitted.

The external ID (shared secret) is securely stored with Kosli Capture. Kosli's internal IAM permissions ensure that the secret can only be accessed by the specific instance of Kosli Capture worker that is operating for you.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improvement — with the pages now split, this section and ## Security above duplicate the dedicated security page.

6e1d5c5 gave Kosli Capture its own folder with security.md as a sibling, but the overview still carries two sections on the same subject: ## Security (lines 25–33, the worker/role isolation model) and ## IAM permissions (this section, the trust policy and external ID). security.md covers the trust policy in full, including the actual AssumeRolePolicyDocument, so lines 71–73 are a prose restatement of a YAML block one click away — and the two will drift.

Worth deciding what each page owns. A reasonable split: the overview says what access is needed and why it is safe in two or three sentences, and the security page owns the mechanism. Right now the only link between them is buried at the end of line 69, and security.md has no link back — the pair is navigable only via the sidebar.

Two things on line 69 itself: "deep-diver" should be "deep dive", and there is a double space before "The".

Suggested change
## IAM permissions
For Kosli Capture to snapshot your environment, you must grant a set of read-only permissions. Kosli's CloudFormation template lists these. The permissions are typically "Describe" or "List" permissions. The [Kosli Capture Security](/administration/kosli_capture/security) page provides a deep-diver into the structure of the permissions needed.
The IAM role created in your environment includes a trust policy that allows Kosli Capture to assume the role. The trust policy limits access to the AWS account in which Kosli Capture is running. Furthermore, the trust policy includes an external ID that acts as a shared secret between Kosli and you, so that only access from Kosli Capture is permitted.
The external ID (shared secret) is securely stored with Kosli Capture. Kosli's internal IAM permissions ensure that the secret can only be accessed by the specific instance of Kosli Capture worker that is operating for you.
For Kosli Capture to snapshot your environment, you must grant a set of read-only permissions. Kosli's CloudFormation template lists these, and they are typically "Describe" or "List" permissions.
The IAM role you create includes a trust policy that allows only Kosli Capture to assume it, using an external ID that acts as a shared secret between you and Kosli. The [Kosli Capture security](/administration/kosli_capture/security) page is a deep dive into the role, the trust policy, and the full permission list.

Comment on lines +92 to +100
# lambda:GetFunction returns a pre-signed URL to the deployment
# package. That is source-code access, so it is denied outright.
- Sid: NeverDownloadFunctionCode
Effect: Deny
Action:
- lambda:GetFunction
- lambda:GetLayerVersion
Resource: "*"
````

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion — the S3 removal left this deny unexplained, and the closing fence has four backticks.

b6dd574 removed the S3BucketMetadataOnly allow and the NeverReadObjectData deny, and with them the comment that explained why explicit denies appear in an allow-list policy at all ("redundant given the allow-list above, but they are here so that a reviewer can verify the boundary…"). NeverDownloadFunctionCode is now the only deny in a policy of allows: its comment says what it blocks, but not why a deny is used rather than simply omitting the action. On a page whose purpose is passing someone else's security review, that rationale was the valuable part.

Also, line 100 closes with (four backticks). CommonMark still terminates the block so it renders, but it is a stray character on the last line of the page. And neither block on this page (lines 20 and 46) declares a language, so a page that is entirely YAML gets no syntax highlighting — worth changing both openers to ```yaml ````.

Suggested change
# lambda:GetFunction returns a pre-signed URL to the deployment
# package. That is source-code access, so it is denied outright.
- Sid: NeverDownloadFunctionCode
Effect: Deny
Action:
- lambda:GetFunction
- lambda:GetLayerVersion
Resource: "*"
````
# lambda:GetFunction returns a pre-signed URL to the deployment
# package. That is source-code access, so it is denied outright.
# The deny is belt-and-braces given the allow-list above, but it
# is here so a reviewer can verify the boundary without reasoning
# about IAM defaults, and so that any future widening of this
# policy cannot accidentally grant code access.
- Sid: NeverDownloadFunctionCode
Effect: Deny
Action:
- lambda:GetFunction
- lambda:GetLayerVersion
Resource: "*"

Comment on lines +20 to +23
There are several benefits to this this architecture:

* the only infrastructure you need to manage is an IAM role; you do not need to install or execute any additional software in your cloud estate;
* Kosli Capture leverages your existing tagging scheme, so as your infrastructure evolves, Kosli Capture will automatically discover the snapshots it needs to take.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion — doubled word, and these two bullets are punctuated unlike every other list on the pages.

"to this this architecture" has a doubled "this". The bullets also start lowercase and terminate with ; / ., whereas the bulleted lists at lines 29–31 and on the security page are sentence-cased.

Suggested change
There are several benefits to this this architecture:
* the only infrastructure you need to manage is an IAM role; you do not need to install or execute any additional software in your cloud estate;
* Kosli Capture leverages your existing tagging scheme, so as your infrastructure evolves, Kosli Capture will automatically discover the snapshots it needs to take.
There are several benefits to this architecture:
* The only infrastructure you need to manage is an IAM roleyou do not need to install or run any additional software in your cloud estate.
* Kosli Capture leverages your existing tagging scheme, so as your infrastructure evolves, Kosli Capture automatically discovers the snapshots it needs to take.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants